package com.ruoyi.trainingManagement.mapper;

import java.util.List;
import java.util.Map;

import com.ruoyi.trainingManagement.domain.CourseScheduleDetails;
import org.apache.ibatis.annotations.Param;

/**
 * 课程排课详细信息Mapper接口
 *
 * @author chenxl
 * @date 2025-06-18
 */
public interface CourseScheduleDetailsMapper
{
    /**
     * 查询课程排课详细信息
     *
     * @param id 课程排课详细信息主键
     * @return 课程排课详细信息
     */
    public CourseScheduleDetails selectCourseScheduleDetailsById(String id);

    /**
     * 查询课程排课详细信息列表
     *
     * @param courseScheduleDetails 课程排课详细信息
     * @return 课程排课详细信息集合
     */
    public  List<CourseScheduleDetails> selectCourseScheduleDetailsList(CourseScheduleDetails courseScheduleDetails);

    /**
     * 新增课程排课详细信息
     *
     * @param courseScheduleDetails 课程排课详细信息
     * @return 结果
     */
    public int insertCourseScheduleDetails(CourseScheduleDetails courseScheduleDetails);
    // public List<CourseScheduleDetails> insertCourseScheduleDetails(CourseScheduleDetails courseScheduleDetails);

    /**
     * 修改课程排课详细信息
     *
     * @param courseScheduleDetails 课程排课详细信息
     * @return 结果
     */
    public int updateCourseScheduleDetails(CourseScheduleDetails courseScheduleDetails);

    /**
     * 删除课程排课详细信息
     *
     * @param id 课程排课详细信息主键
     * @return 结果
     */
    public int deleteCourseScheduleDetailsById(String id);

    /**
     * 批量删除课程排课详细信息
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteCourseScheduleDetailsByIds(String[] ids);

    List<CourseScheduleDetails> findCoursesBySemesterAndYearAndStatus(
            @Param("semesterId") int semesterId,
            @Param("academicYear") int academicYear,
            @Param("isScheduleCompleted") int isScheduleCompleted
    );

    int updateTeacherIdById(@Param("id") String id, @Param("teacherId") String teacherId);

    /**
     * 根据课程ID、学期ID、年级查询课程排课信息
     * @param courseId 课程ID
     * @param semesterId 学期ID（与SQL中的#{semesterId}对应）
     * @param grade 年级
     * @return 课程排课信息列表
     */
    List<CourseScheduleDetails> selectByCourseSemesterGrade(
            @Param("courseId") String courseId,  // 对应SQL中的#{courseId}
            @Param("semesterId") int semesterId,  // 对应SQL中的#{semesterId}
            @Param("grade") int grade             // 对应SQL中的#{grade}
    );

    /**
     * 通过课程班ID查询关联的行政班ID列表
     * @param courseId 课程班ID（对应course_schedule_details表的id）
     * @return 行政班ID列表
     */
    List<String> selectAdminClassIdsByCourseId(@Param("courseId") String courseId);

    List<Map<String, Object>> selectAdminClassIdsByCourseIds(@Param("courseIds") List<String> courseIds);
    /**
     * 根据ID查询课程班信息（纯MyBatis手动定义）
     */
    CourseScheduleDetails selectById(String id);
    // 新增：根据ID更新课程班信息（含成绩配置）
    int updateById(CourseScheduleDetails schedule);

    /**
     * 根据学院ID列表查询课程排课详情（关联课程表）
     * @param collegeIds 学院ID列表
     * @return 课程排课详情列表
     */
    List<CourseScheduleDetails> selectCourseScheduleDetailsByCollegeIds(List<String> collegeIds);

    /**
     * 根据ID列表查询课程排课详情
     * @param ids ID列表
     * @return 课程排课详情列表
     */
    List<CourseScheduleDetails> selectCourseScheduleDetailsByIds(@Param("list") List<String> ids);

    /**
     * 多表联查：根据学院ID列表直接查询对应的排课详情
     * @param collegeIds 学院ID列表
     * @return 排课详情列表（含完整字段）
     */
    List<CourseScheduleDetails> selectScheduleDetailsByCollegeIds(@Param("list") List<String> collegeIds);
}
